package xhe.lib.date;

import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;

/**
 * @Class 时间比较类
 * @author xhe
 * @Data 2020年1月16日
 * @Version V1.0.0.0
 */
/**
 * <b> 工具类: </b> 时间比较类
 * 
 * @author xhe
 * @version V1.0.0.0
 * @version --2020年7月23日
 */
public class TimeStamp {
	private static SimpleDateFormat _SimpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
	private static Calendar _StartDate = Calendar.getInstance();
	private static Calendar _EndDate = Calendar.getInstance();
	private static DateFormat _DateFormat = DateFormat.getDateInstance();
	private static Date _Earlydate = new Date();
	private static Date _Latedate = new Date();

	/**
	 * <b> 方法: </b> 计算两个时间相差多少个年
	 * 
	 * @author xhe
	 * @param start 开始时间
	 * @param end   结束时间
	 * @return int 相差的年份
	 * @throws ParseException 计算异常
	 * @version V1.0.0.0
	 * @version --2020年1月16日
	 * @version --新增方法
	 */
	public static int compareYears(String start, String end) throws ParseException {
		_StartDate.setTime(_SimpleDateFormat.parse(start));
		_EndDate.setTime(_SimpleDateFormat.parse(end));
		return (_EndDate.get(Calendar.YEAR) - _StartDate.get(Calendar.YEAR));
	}

	/**
	 * <b> 方法: </b> 计算两个时间相差多少个月
	 * 
	 * @author xhe
	 * @param start 开始时间
	 * @param end   结束时间
	 * @return int 相差的月份
	 * @throws ParseException 计算异常
	 * @version V1.0.0.0
	 * @version --2020年1月16日
	 * @version --新增方法
	 */
	public static int compareMonths(String start, String end) throws ParseException {
		_StartDate.setTime(_SimpleDateFormat.parse(start));
		_EndDate.setTime(_SimpleDateFormat.parse(end));
		int result = compareYears(start, end) * 12 + _EndDate.get(Calendar.MONTH) - _StartDate.get(Calendar.MONTH);
		return result == 0 ? 1 : Math.abs(result);

	}

	/**
	 * <b> 方法: </b> 计算两个时间相差多少个天
	 * 
	 * @author xhe
	 * @param start 开始时间
	 * @param end   结束时间
	 * @return 相差的天
	 * @throws ParseException 计算异常
	 * @version V1.0.0.0
	 * @version --2020年1月16日
	 * @version --新增方法
	 */
	public static int compareDays(String start, String end) throws ParseException {
		// 得到两个日期相差多少天
		return compareHours(start, end) / 24;
	}

	/**
	 * <b> 方法: </b> 计算两个时间相差多少小时
	 * 
	 * @author xhe
	 * @param start 开始时间
	 * @param end   结束时间
	 * @return 相差的小时
	 * @throws ParseException 计算异常
	 * @version V1.0.0.0
	 * @version --2020年1月16日
	 * @version --新增方法
	 */
	public static int compareHours(String start, String end) throws ParseException {
		// 得到两个日期相差多少小时
		return compareMinutes(start, end) / 60;
	}

	/**
	 * <b> 方法: </b> 计算两个时间相差多少分
	 * 
	 * @author xhe
	 * @param start 开始时间
	 * @param end   结束时间
	 * @return 相差的分钟
	 * @throws ParseException 计算异常
	 * @version V1.0.0.0
	 * @version --2020年1月16日
	 * @version --新增方法
	 */
	public static int compareMinutes(String start, String end) throws ParseException {
		// 得到两个日期相差多少分
		return compareSecondes(start, end) / 60;
	}

	/**
	 * <b> 方法: </b> 计算两个时间相差多少秒
	 * 
	 * @author xhe
	 * @param start 开始时间
	 * @param end   结束时间
	 * @return 相差的秒
	 * @throws ParseException 计算异常
	 * @version V1.0.0.0
	 * @version --2020年1月16日
	 * @version --新增方法
	 */
	public static int compareSecondes(String start, String end) throws ParseException {
		_Earlydate = _DateFormat.parse(start);
		_Latedate = _DateFormat.parse(end);
		_StartDate.setTime(_Earlydate);
		_EndDate.setTime(_Latedate);
		// 设置时间为0时
		_StartDate.set(Calendar.HOUR_OF_DAY, 0);
		_StartDate.set(Calendar.MINUTE, 0);
		_StartDate.set(Calendar.SECOND, 0);
		_EndDate.set(Calendar.HOUR_OF_DAY, 0);
		_EndDate.set(Calendar.MINUTE, 0);
		_EndDate.set(Calendar.SECOND, 0);
		// 得到两个日期相差多少秒
		return ((int) (_EndDate.getTime().getTime() / 1000) - (int) (_StartDate.getTime().getTime() / 1000));
	}

	/**
	 * <b> 方法: </b> 计算两个时间相差多少毫秒
	 * 
	 * @author xhe
	 * @param start 开始时间
	 * @param end   结束时间
	 * @return 相差的秒
	 * @throws ParseException 计算异常
	 * @version V1.0.0.0
	 * @version --2020年10月28日
	 * @version --新增方法
	 */
	public static long compareMillsSecondes(String start, String end) throws ParseException {
		_Earlydate = _DateFormat.parse(start);
		_Latedate = _DateFormat.parse(end);
		_StartDate.setTime(_Earlydate);
		_EndDate.setTime(_Latedate);

		Long lStartDate = _StartDate.getTimeInMillis();
		Long lEndDate = _EndDate.getTimeInMillis();
		// 相差毫秒数
		return (lEndDate - lStartDate);
	}

	/**
	 * <b> 方法: </b> 计算两个时间差
	 * 
	 * @author xhe
	 * @param start 开始时间
	 * @param end   结束时间
	 * @param type  返回类型
	 * @return 时间差
	 * @throws ParseException 计算异常
	 * @version V1.0.0.0
	 * @version --2021年09月09日
	 * @version --新增方法
	 */
	public static long compare(Object start, Object end, String type) throws ParseException {

		SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		System.out.println("start:" + start.toString());
		Date dtStart = null;
		if (start instanceof String) {
			dtStart = format.parse(start.toString());
		} else {
			dtStart = (Date) start;
		}

		Date dtEnd = null;
		if (end instanceof String) {
			dtEnd = format.parse(end.toString());
		} else {
			dtEnd = (Date) end;
		}

		// 毫秒ms
		long diff = dtEnd.getTime() - dtStart.getTime();

		if (type.equals("S")) {

			// 秒
			diff = diff / 1000 % 60;

		} else if (type.equals("M")) {

			// 分钟
			diff = diff / (60 * 1000) % 60;

		} else if (type.equals("H")) {

			// 小时
			diff = diff / (60 * 60 * 1000) % 24;

		} else if (type.equals("D")) {

			// 天
			diff = diff / (24 * 60 * 60 * 1000);
		}

		return diff;
	}

	public static long compare(String start) throws ParseException {

		SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		System.out.println("start:" + start.toString());
		Date dtStart = format.parse(start.toString());
		Date dtEnd = new Date();

		// 毫秒ms
		long diff = dtEnd.getTime() - dtStart.getTime();

		// 分钟
		diff = diff / (60 * 1000) % 60;

		return diff;
	}

	/**
	 * <b> 方法: </b> 计算两个时间相差多少个天
	 * 
	 * @author xhe
	 * @param start 开始时间
	 * @param end   结束时间
	 * @return 相差的天
	 * @throws ParseException 计算异常
	 * @version V1.0.0.0
	 * @version --2021年09月09日
	 * @version --新增方法
	 */
	public static long compareDays(Object start, Object end) throws ParseException {

		return compare(start, end, "D");
	}

	/**
	 * <b> 方法: </b> 计算两个时间相差多少小时
	 * 
	 * @author xhe
	 * @param start 开始时间
	 * @param end   结束时间
	 * @return 相差的小时
	 * @throws ParseException 计算异常
	 * @version V1.0.0.0
	 * @version --2021年09月09日
	 * @version --新增方法
	 */
	public static long compareHours(Object start, Object end) throws ParseException {

		return compare(start, end, "H");
	}

	/**
	 * <b> 方法: </b> 计算两个时间相差多少分
	 * 
	 * @author xhe
	 * @param start 开始时间
	 * @param end   结束时间
	 * @return 相差的分钟
	 * @throws ParseException 计算异常
	 * @version V1.0.0.0
	 * @version --2021年09月09日
	 * @version --新增方法
	 */
	public static long compareMinutes(Object start, Object end) throws ParseException {

		return compare(start, end, "M");
	}

	/**
	 * <b> 方法: </b> 计算两个时间相差多少秒
	 * 
	 * @author xhe
	 * @param start 开始时间
	 * @param end   结束时间
	 * @return 相差的秒
	 * @throws ParseException 计算异常
	 * @version V1.0.0.0
	 * @version --2021年09月09日
	 * @version --新增方法
	 */
	public static long compareSecondes(Object start, Object end) throws ParseException {

		return compare(start, end, "S");
	}

	/**
	 * <b> 方法: </b> 计算两个时间相差多少毫秒
	 * 
	 * @author xhe
	 * @param start 开始时间
	 * @param end   结束时间
	 * @return 相差的秒
	 * @throws ParseException 计算异常
	 * @version V1.0.0.0
	 * @version --2021年09月09日
	 * @version --新增方法
	 */
	public static long compareMillsSecondes(Object start, Object end) throws ParseException {

		return compare(start, end, "");
	}
}
